home *** CD-ROM | disk | FTP | other *** search
- /*
- * genctest.c
- *
- * test i/f for gencall.s and gencif.c
- */
-
-
- #include "gencall.h"
- #include <math.h>
-
-
-
- static int args[] = {
- { (int) "Arg1=%d Arg2=%s Arg3=%d Arg4=%s \n" },
- { 5 },
- { (int) "This is arg2" },
- { 6 },
- { (int) "This is arg4" },
- };
-
- double weird_FFII( float a, float b, int i, int j )
- {
- printf( "weird_FFII %f %f %d %d\n", a, b, i, j );
- return a;
- }
-
- double weird_DFI( double a, float b, int i )
- {
- printf( "weird_DFI %f %f %d\n", a, b, i );
- return a;
- }
-
- main()
- {
- extern int printf();
- extern void * memcpy();
-
- double dret;
- double darg;
-
- float farg;
- float fret;
-
- float faarg[ 5 ];
-
- CallFromGeneralArgs(
- memcpy,
- args,
- sizeof( args ),
- 0,
- 0,
- printf
- );
-
- darg = 144.0;
-
- CallFromGeneralArgs(
- memcpy,
- & darg,
- sizeof( darg ),
- RETDOUBLE | FP_PASS_D,
- &dret,
- sqrt
- );
-
- printf( "Sqrt of %f is %f\n", darg, dret );
-
- farg = 81.0;
-
- CallFromGeneralArgs(
- memcpy,
- & farg,
- sizeof( farg ),
- RETFLOAT | FP_PASS_F,
- &fret,
- sqrtf
- );
-
- printf( "Sqrt of %f is %f\n", farg, fret );
-
- faarg[ 0 ] = 5.0;
- faarg[ 1 ] = 144.0;
-
- * ( int * )( faarg + 2 ) = 55;
- * ( int * )( faarg + 3 ) = 67;
-
- CallFromGeneralArgs(
- memcpy,
- & faarg,
- sizeof( faarg ),
- FP_PASS_F_F | RETDOUBLE,
- &dret,
- weird_FFII
- );
-
- printf( "weird_FFII returns %f\n", dret );
-
- * ( double * )( faarg + 0 ) = 555.3;
- faarg[ 2 ] = 144.0;
- * ( int * )( faarg + 3 ) = 99;
-
- CallFromGeneralArgs(
- memcpy,
- & faarg,
- sizeof( faarg ),
- FP_PASS_D_F | RETDOUBLE,
- &dret,
- weird_DFI
- );
-
- printf( "weird_DFI returns %f\n", dret );
-
-
- ciftest();
- }
-
-
- #define ARYNI( ARRAY ) ARRAY, ( sizeof ARRAY )/( sizeof * ARRAY )
-
- GCIF_ARG gargs[] = {
- gcif_double, /* GCIF_ETYPE gcif_type : 8; */
- 8, /* unsigned gcif_align : 8; */
- 8, /* unsigned gcif_size : 16; */
- };
-
- void * argv[] = {
- ( void * ) 0,
- };
-
- GCIF_CALLDESC cd[1] = {
- /* GCIF_ARG * gcif_args; * args */
- /* unsigned gcif_nargs; * number of args */
- ARYNI( gargs ),
-
- gcif_double, /* GCIF_ETYPE gcif_rettype; */
- sizeof( double ), /* unsigned gcif_retsize; */
-
- 8, /* unsigned gcif_bytes; */
- GCIF_MKFLAGS( gcif_double, FP_PASS( gcif_double, gcif_void ) ),
- /* unsigned gcif_flags; */
-
- /* void ** gcif_argv; * arg value pointers */
- /* int gcif_nargv; * number of value pointers */
- ARYNI( argv ),
-
- /* void * gcif_retv; * Return value */
- };
-
- GCIF_ARG zargs[] = {
- {
- gcif_double, /* GCIF_ETYPE gcif_type : 8; */
- 8, /* unsigned gcif_align : 8; */
- 8, /* unsigned gcif_size : 16; */
- },
- {
- gcif_float, /* GCIF_ETYPE gcif_type : 8; */
- 4, /* unsigned gcif_align : 8; */
- 4, /* unsigned gcif_size : 16; */
- },
- {
- gcif_int, /* GCIF_ETYPE gcif_type : 8; */
- 4, /* unsigned gcif_align : 8; */
- 4, /* unsigned gcif_size : 16; */
- },
- };
-
- void * zargv[] = {
- ( void * ) 0,
- ( void * ) 0,
- ( void * ) 0,
- };
-
- GCIF_CALLDESC zcd[1] = {
- /* GCIF_ARG * gcif_args; * args */
- /* unsigned gcif_nargs; * number of args */
- ARYNI( zargs ),
-
- gcif_double, /* GCIF_ETYPE gcif_rettype; */
- sizeof( double ), /* unsigned gcif_retsize; */
-
- 0, /* unsigned gcif_bytes; */
- 0,
- /* GCIF_MKFLAGS( gcif_double, FP_PASS( gcif_double, gcif_float ) ), */
- /* unsigned gcif_flags; */
-
- /* void ** gcif_argv; * arg value pointers */
- /* int gcif_nargv; * number of value pointers */
- ARYNI( zargv ),
-
- /* void * gcif_retv; * Return value */
- };
-
- ciftest()
- {
- double retval;
- float arg2;
- int i;
-
- cd->gcif_retv = ( void * ) & retval;
-
- argv[ 0 ] = ( void * ) & retval;
-
- retval = 121.0;
-
- gcif_call( sqrt, cd );
-
- printf( "sqrt of 121 is %f\n", retval );
-
- gcif_filldesc( zcd );
- zcd->gcif_retv = ( void * ) & retval;
-
- zargv[ 0 ] = ( void * ) & retval;
- zargv[ 1 ] = ( void * ) & arg2;
- zargv[ 2 ] = ( void * ) & i;
-
- retval = 55.4;
- arg2 = 44.3;
- i = 77;
-
- gcif_call( weird_DFI, zcd );
-
- printf( "weird_DFI returns %f\n", retval );
-
- }
-
- /* structure passing example */
-
- typedef struct {
- char val[23];
- } as;
-
- GCIF_ARG sargs[] = {
- {
- gcif_struct, /* GCIF_ETYPE gcif_type : 8; */
- 4, /* unsigned gcif_align : 8; */
- sizeof(as), /* unsigned gcif_size : 16; */
- },
- {
- gcif_float, /* GCIF_ETYPE gcif_type : 8; */
- 4, /* unsigned gcif_align : 8; */
- 4, /* unsigned gcif_size : 16; */
- },
- {
- gcif_int, /* GCIF_ETYPE gcif_type : 8; */
- 4, /* unsigned gcif_align : 8; */
- 4, /* unsigned gcif_size : 16; */
- },
- };
-
- void * sargv[] = {
- ( void * ) 0,
- ( void * ) 0,
- ( void * ) 0,
- };
-
- GCIF_CALLDESC scd[1] = {
- /* GCIF_ARG * gcif_args; * args */
- /* unsigned gcif_nargs; * number of args */
- ARYNI( sargs ),
-
- gcif_struct, /* GCIF_ETYPE gcif_rettype; */
- sizeof( as ), /* unsigned gcif_retsize; */
-
- 0, /* unsigned gcif_bytes; */
- 0,
- /* GCIF_MKFLAGS( gcif_double, FP_PASS( gcif_double, gcif_float ) ), */
- /* unsigned gcif_flags; */
-
- /* void ** gcif_argv; * arg value pointers */
- /* int gcif_nargv; * number of value pointers */
- ARYNI( sargv ),
-
- /* void * gcif_retv; * Return value */
- };
-
- as as_SFI( as a, float b, int i )
- {
- printf( "as_SFI %s %f %d\n", a.val, b, i );
- return a;
- }
-
- example_struct()
- {
- double retval;
- float arg2;
- int i;
- as s;
- as s1;
-
- gcif_filldesc( scd );
- scd->gcif_retv = ( void * ) & s1;
-
- sargv[ 0 ] = ( void * ) & s;
- sargv[ 1 ] = ( void * ) & arg2;
- sargv[ 2 ] = ( void * ) & i;
-
- strcpy( s.val, "Hello world" );
- arg2 = 122.7;
- i = 29;
-
- gcif_call( as_SFI, scd );
-
- printf( "as_SFI returns %s\n", s1.val );
- }
-
-